如同優化列表資料一樣,新增表單欄位更需要依據規格定義,提供最合適的編修條件。首先,從優化列舉欄位說起。
列舉 (Enumeration) 資料型態在程式開發中的重要性已經無需多言,ORM 實作支援列舉欄位的困難度,可以由微軟 EF Team 的 Diego B Vega 回應這項功能支援時程的提問 Still No Enum Support?,可以窺見大概, Entity Framework 則是直到 4.1 版之後才支援列舉資料型態欄位。
今天暫且說明一般的列舉欄位,至於加註 System.FlagsAttribute 的位元旗標列舉,留待之後說明。列舉型態欄位在新增表單的呈現,可以採用 <radio> 與 <select> 2 種設計模式,下面只說明 <radio> 的實作方式,<select> 表單的呈現方式相似,這裡就不多說。
處理步驟:
1. 判定資料欄位是否為列舉型態
Column 類別提供 IsEnum 屬性,可以自我描述是否為列舉型態。
if(column.IsEnum){
// code here!
}
2. 從列舉快取裡,取出該列舉欄位型態 (column.Property.PropertyType) 的列舉物件定義
EnumReference ef = EnumCache.Get(column.Property.PropertyType);
3. 以<radio>表單呈現
<radio> 的 name 屬性值,一樣是由 Column.AsName 定義,id 屬性是為了配合可以從點選<label> 字串而選取特定項目,所以採用 {Column.AsName}_{EnumItem.Value} 定義。
foreach(EnumItem ei in ef.Items) {
sb.AppendFormat(
"<input type=\"radio\" id=\"{0}\" name=\"{1}\" value=\"{2}\"><label for=\"{0}\">{3}</label>",
column.AsName + "_" + ei.Value,
column.AsName,
ei.Value,
ei.Title
);
}
這樣的程式碼,將會產生下面的表單樣式: